//编写序列化写端
#include<iostream>
#include<fstream>
#include"contacts.pb.h"                     

using namespace std;




void AddPeopleInfo(scontacts2::PeopleInfo* people_info)
{
    cout << "-------------新增联系⼈-------------" << endl;
    cout << "请输入联系⼈的姓名：";
    string name;
    getline(cin, name);
    people_info->set_name(name);

    // cout << "请输入联系⼈年龄：";
    // int age;
    // cin >> age;
    // people_info->set_age(age);
    // //前面用了 cin >> age; 读取一个整数后，用户输入时最后按下的回车键（\n）仍然留在输入缓冲区。
    // //如果不清理掉这个残留的换行符，下一次使用 getline(cin, str) 等读取整行字符串的操作时，会直接读到这个换行符，导致读取失败或行为异常。
    // //丢弃（忽略）输入缓冲区中最多 256 个字符，直到遇到换行符 '\n' 为止。
    // cin.ignore(256, '\n');

    cout << "请输入联系人生日: ";
    int birthday;
    cin >> birthday;
    people_info->set_birthday(birthday);
    cin.ignore(256, '\n');

    for(int i = 0; ;i++)
    {
        cout << "请输入联系⼈的电话号码 " << i+1 << "(输入回车退出): ";
        string number;
        getline(cin, number);
        if(number.empty()) break;
        scontacts2::PeopleInfo_Phone* phone = people_info->add_phone_numbers();
        phone->set_number(number);
    }
    
    cout << "-----------添加联系⼈成功-----------" << endl;
}

int main()
{
    scontacts2::Contacts contacts;
    //1.读取已存在的文件，若不存在则创建一个空文件
    fstream in("../contacts.bin", ios::in | ios::binary);
    if(!in) {cout << "File not exist, create a new one." << endl;}
    else{
        if(!contacts.ParseFromIstream(&in)){
            cout << "Parse file failed" << endl;
            return -1;
        }
        cout << "Parse file success" << endl;
    }

    //2.添加联系人到通讯录
    AddPeopleInfo(contacts.add_people());

    //3.将通讯录序列化到文件中
    fstream out("../contacts.bin", ios::out | ios::trunc | ios::binary);
    if(!contacts.SerializeToOstream(&out)){
        cout << "Serialize file failed" << endl;
        return -1;
    }
    cout << "Serialize file success" << endl;   

    //4.关闭文件
    in.close();
    out.close();
    return 0;
}